package cn.ronghuanet.auth.interceptor;

import cn.ronghuanet.auth.annotation.RonghuanetPermission;
import cn.ronghuanet.auth.service.IPermissionService;
import cn.ronghuanet.base.util.BaseLoginMap;
import cn.ronghuanet.org.domain.Employee;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private IPermissionService service;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取前端发送过来的 token
        String token = request.getHeader("token");
        if (Objects.isNull(token)){
            response.getWriter().write("{\"success\":false,\"message\":\"noLogin\"}");
            return false;
        }
        // 从map中通过token获取user对象
        Object object = BaseLoginMap.loginMap.get(token);
        // 如果对象为空 则 未登陆
        if (Objects.isNull(object)){
            response.getWriter().write("{\"success\":false,\"message\":\"noLogin\"}");
            return false;
        }
        // 如果不为空则 放行
        Employee employe = (Employee)object;
        // 你访问的这个资源 你是否有权限
        // 1. 判断访问的资源是否是需要权限的 == 不要权限 直接放行.如果需要权限的资源 验证

        HandlerMethod methodHandlerMethod = (HandlerMethod)handler; // 方法
        Class clazz = methodHandlerMethod.getBeanType();// 获取到类
        Method method = methodHandlerMethod.getMethod();// 获取到请求的方法
        // 判断 方法上面是否有 权限注解 如果没有  直接放行
        RonghuanetPermission annotation = method.getAnnotation(RonghuanetPermission.class);

        if (Objects.nonNull(annotation)) { // 进入if证明方法是需要权限的
            // 2. 资源是需要权限的 先查询用户是否有权限
            // 2.1 首先获取用户的权限 不就是通过要用户 id  > role > permission   list
            List<String> list = service.getPermissionSnsById(employe.getId());
            // 2.2 拿到请求的资源的 资源 /employee  EmployeeController:delete 权限 类名:方法名
            String sn = clazz.getSimpleName() +":"+ method.getName();
            // 2.3 判断用户是否有权限了
            // 如果没有权限 拦截
            if (!list.contains(sn)){
                response.getWriter().write("{\"success\":false,\"message\":\"noPermission\"}");
                return false;
            }
            // 如果有权限 放行
        }


        return true;
    }
}
